home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 275_02 / rijn22.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-01  |  17.8 KB  |  588 lines

  1.  
  2. /* rijn22.c                        */
  3. /* program for lcau22 option 'd'            */
  4. /* display de Bruijn diagram - 1st, 2nd, & 3rd gen    */
  5. /* Harold V. McIntosh, 20 February 1988            */
  6. /* 21 February 1988 - add j0=i0; to Pass 4's        */
  7. /* 3 March 1988 - adapted from lca21.c to lca22.c    */
  8.  
  9. /*  Copyright (C) 1987    */
  10. /*  Copyright (C) 1988    */
  11. /*  Harold V. McIntosh    */
  12. /*  Gerardo Cisneros S.    */
  13.  
  14. # define JX   0.8  /* x-center, de Bruijn diagram    */
  15. # define JY   0.5  /* y-center, de Bruijn diagram    */
  16. # define RI 0.455  /* inner radius, de Bruijn diagram    */
  17. # define RO 0.475  /* outer radius, de Bruijn diagram    */
  18. # define NW    24  /* pause after so many lines        */
  19.  
  20. int  dd;        /* # points in de Bruijn ring    */
  21. int  mc, nc, nl;    /* column & line control    */
  22.  
  23. /* edit the de Bruijn diagram */
  24. edijn() {char c;
  25.  
  26.   clijn();
  27.   dd=KK*KK*KK*KK;
  28.   ijn(dd,KK,2);
  29.   while (0<1) {
  30.   videocursor(0,0,36);
  31.   videoputc('?',2);
  32.   c=kbdin();
  33.   if (c=='\015') break;
  34.   videocursor(0,0,38);
  35.   videoputc(c,2);
  36.   videocursor(0,0,36);
  37.   videoputc(' ',2);
  38.   videoscroll(1,0,24,14,0,0);
  39.   videocursor(0,0,0);
  40.   kwait(3);
  41.   switch (c) {
  42.     case 'A': dd=KK*KK*KK*KK; ijn(dd,KK,2); sijn(dd,0,1); break;
  43.     case 'B': dd=KK*KK*KK*KK; ijn(dd,KK,2); sijn(dd,1,1); break;
  44.     case 'C': dd=KK*KK*KK*KK; ijn(dd,KK,2); zijn(dd,0,1); break;
  45.     case 'D': dd=KK*KK*KK*KK; ijn(dd,KK,2); zijn(dd,1,1); break;
  46.     case 'E': dd=KK*KK*KK*KK; ijn(dd,KK,2); zijn(dd,2,1); break;
  47.     case 'F': dd=KK*KK*KK*KK; ijn(dd,KK,2); zijn(dd,3,1); break;
  48.     case 'G': dd=KK*KK*KK*KK; ijn(dd,KK,2); zijn(dd,4,1); break;
  49.     case 'a': kwait(0); printf("Precursors 0*:");  kwait(0); xpass1(0); break;
  50.     case 'b': kwait(0); printf("Precursors 1*:");  kwait(0); xpass1(1); break;
  51.     case 'c': kwait(0); printf("(1,-2) gliders:"); kwait(0); apass1(0); break;
  52.     case 'd': kwait(0); printf("(1,-1) gliders:"); kwait(0); apass1(1); break;
  53.     case 'e': kwait(0); printf("(1,0) static:");   kwait(0); apass1(2); break;
  54.     case 'f': kwait(0); printf("(1,1) gliders:");  kwait(0); apass1(3); break;
  55.     case 'g': kwait(0); printf("(1,2) gliders:");  kwait(0); apass1(4); break;
  56.     case 'h': kwait(0); printf("(2,-4) gliders:"); kwait(0); bpass1(0); break;
  57.     case 'i': kwait(0); printf("(2,-3) gliders:"); kwait(0); bpass1(1); break;
  58.     case 'j': kwait(0); printf("(2,-2) gliders:"); kwait(0); bpass1(2); break;
  59.     case 'k': kwait(0); printf("(2,-1) gliders:"); kwait(0); bpass1(3); break;
  60.     case 'l': kwait(0); printf("(2,0) cycles:");   kwait(0); bpass1(4); break;
  61.     case 'm': kwait(0); printf("(2,1) gliders:");  kwait(0); bpass1(5); break;
  62.     case 'n': kwait(0); printf("(2,2) gliders:");  kwait(0); bpass1(6); break;
  63.     case 'o': kwait(0); printf("(2,3) gliders:");  kwait(0); bpass1(7); break;
  64.     case 'p': kwait(0); printf("(2,4) gliders:");  kwait(0); bpass1(8); break;
  65.     case '1': dd=KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  66.     case '2': dd=KK*KK*KK*KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  67.     case '3': dd=KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  68.     case '4': dd=KK*KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  69.     case '5': dd=KK*KK*KK*KK*KK*KK*KK; clijn(); ijn(dd,KK,2); break;
  70.     case '+': videopalette(WHCYMAG); break;
  71.     case '-': videopalette(YELREGR); break;
  72.     case '?': case '/': clijn(); break;
  73.     default: break;
  74.     }; /* end switch */
  75.   };   /* end while  */
  76.   videopalette(WHCYMAG);
  77.   videomode(T80X25);
  78. }
  79.  
  80. /* clear edijn screen and set up menu */
  81. clijn() {
  82.   videomode(COLGRAF);
  83.   videopalette(YELREGR);
  84.   videocursor(0,0,0);
  85.   scrrul();
  86.   videocursor(0,3,0);
  87.   printf("de Bruijn ring\n\n");
  88.   printf("ab   -  0*,1*\n");
  89.   printf("AB   -  full n*\n");
  90.   printf("cdefg - (1,x)\n");
  91.   printf("CDEFG - (all)\n");
  92.   printf("h.l.p - (2,x)\n");
  93.   printf("12345 - diagram\n");
  94.   printf("+-   - pallette\n");
  95.   printf("?/   - clr scrn\n");
  96.   printf("<cr> - exit\n\n");
  97. }
  98.  
  99. /* generate a de Bruijn diagram with m nodes, n links per node, color l */
  100. ijn(m,n,l) int m, n, l; {
  101. int    i, j;
  102. double ii, jj, nn, x, y, t, h;
  103. double sin(), cos();
  104. nn=(double)(n);
  105. t=6.28318/((double)(m));
  106. h=0.5*t;
  107. for (i=0; i<m; i++) {
  108.   ii=(double)(i);
  109.   for (j=0; j<n; j++) {
  110.     jj=(double)(j);
  111.     x=JX-RI*sin(ii*t+h);
  112.     y=JY-RI*cos(ii*t+h);
  113.     videoline(x,y,0);
  114.     x=JX-RO*sin((nn*ii+jj)*t+h);
  115.     y=JY-RO*cos((nn*ii+jj)*t+h);
  116.     videoline(x,y,l);
  117.     };
  118.   };
  119. }
  120.  
  121. /* insert a link into a de Bruijn diagram */
  122. /* m - number of vertices */
  123. /* u - initial vertex     */
  124. /* v - terminal vertex    */
  125. /* l - color of link      */
  126. lijnk(m,u,v,l) int m, u, v, l; {
  127. double uu, vv, x, y, t, h;
  128. double sin(), cos();
  129. t=6.28318/((double)(m));
  130. uu=t*((double)(u));
  131. vv=t*((double)(v));
  132. h=0.5*t;
  133. x=JX-RI*sin(uu+h);
  134. y=JY-RI*cos(uu+h);
  135. videoline(x,y,0);
  136. x=JX-RO*sin(vv+h);
  137. y=JY-RO*cos(vv+h);
  138. videoline(x,y,l);
  139. }
  140.  
  141. /* generate a de Bruijn diagram showing antecedents of state k in color l */
  142. sijn(m,k,l) int m, k, l; {
  143. int    i0, i1, i2, i3, i4;
  144. double th, x, y, t, h;
  145. double sin(), cos();
  146. t=6.28318/((double)(m));
  147. h=0.5*t;
  148. for (i0=0; i0<KK; i0++) {
  149. for (i1=0; i1<KK; i1++) {
  150. for (i2=0; i2<KK; i2++) {
  151. for (i3=0; i3<KK; i3++) {
  152. for (i4=0; i4<KK; i4++) {
  153.   if (k==ascrule[i0][i1][i2][i3][i4]-'0') {
  154.     th=((double)(((i0*KK+i1)*KK+i2)*KK+i3)*t+h);
  155.     x=JX-RI*sin(th);
  156.     y=JY-RI*cos(th);
  157.     videoline(x,y,0);
  158.     th=((double)(((i1*KK+i2)*KK+i3)*KK+i4)*t+h);
  159.     x=JX-RO*sin(th);
  160.     y=JY-RO*cos(th);
  161.     videoline(x,y,l);
  162.     };         /* end if    */
  163.   };};};};}; /* end for's */
  164. }         /* end sijn  */
  165.  
  166. /* generate a de Bruijn diagram showing the (1,k) links in color l */
  167. zijn(m,k,l) int m, k, l; {
  168. int    i, i0, i1, i2, i3, i4;
  169. double th, x, y, t, h;
  170. double sin(), cos();
  171. t=6.28318/((double)(m));
  172. h=0.5*t;
  173. for (i0=0; i0<KK; i0++) {
  174. for (i1=0; i1<KK; i1++) {
  175. for (i2=0; i2<KK; i2++) {
  176. for (i3=0; i3<KK; i3++) {
  177. for (i4=0; i4<KK; i4++) {
  178.   i=ascrule[i0][i1][i2][i3][i4]-'0';
  179.   if ((k==0&&i==i0)||(k==1&&i==i1)||(k==2&&i==i2)||(k==3&&i==i3)||(k==4&&i==i4)) {
  180.     th=((double)(((i0*KK+i1)*KK+i2)*KK+i3)*t+h);
  181.     x=JX-RI*sin(th);
  182.     y=JY-RI*cos(th);
  183.     videoline(x,y,0);
  184.     th=((double)(((i1*KK+i2)*KK+i3)*KK+i4)*t+h);
  185.     x=JX-RO*sin(th);
  186.     y=JY-RO*cos(th);
  187.     videoline(x,y,l);
  188.     };         /* end if    */
  189.   };};};};}; /* end for's */
  190. }         /* end zijn  */
  191.  
  192. /* plot graph on video screen            */
  193. /* move pen from present position to (x,y) */
  194. /* raised if l=0; color l if l>0       */
  195. videoline(x,y,l) double x, y; int l; {
  196. int k, ax, ay, dx, dy, di, dj, x1, y1;
  197. /* if (x<0.0) return; if (x>1.0) return */
  198. /* if (y<0.0) return; if (y>1.0) return */
  199. x1=(int)(199.0*(1.0-y));y1=(int)(199.0*x);
  200. dx=x1-ix0;
  201. dy=y1-iy0;
  202. ax=dx>=0?dx:-dx;
  203. ay=dy>=0?dy:-dy;
  204. di=dx>=0?1:-1; if (dx==0) di=0;
  205. dj=dy>=0?1:-1; if (dy==0) dj=0;
  206.  
  207. if (l>0) {if (ax!=0 || ay!=0) {
  208.   if (ax>=ay) {for (k=0; k<=ax; k++) videodot(ix0+di*k,60+iy0+(k*dy)/ax,l);}
  209.      else {for (k=0; k<=ay; k++) videodot(ix0+(k*dx)/ay,60+iy0+dj*k,l);};
  210.   }; };
  211. ix0=x1;
  212. iy0=y1;
  213. }
  214.  
  215. /* approximation to sine */
  216. double sin(x) double x; {
  217. if (x<0.0) return(-sin(-x));
  218. while (x>=6.28318) x-=6.28318;
  219. if (x>=3.142) return(-sin(x-3.14159));
  220. if (x>=1.571) return(sin(3.14159-x));
  221. return(x*(1.0-0.166*(x*x-0.05*x*x)));
  222. }
  223.  
  224. /* approximation to cosine */
  225. double cos(x) double x; {double sin(); return(sin(x+1.57079));}
  226.  
  227. /* ONE22.C */
  228.  
  229. /* Pass 1a analyzes all the configurations which fulfil (1,-1+l) */
  230. apass1(l) int l; {
  231. char arry[KK][KK][KK][KK][KK];
  232. int  i0, i1, i2, i3, i4, m;
  233. mc=1;
  234. asctobin();
  235. printf(" Pass1a\015");
  236. for (i0=0; i0<KK; i0++) {
  237. for (i1=0; i1<KK; i1++) {
  238. for (i2=0; i2<KK; i2++) {
  239. for (i3=0; i3<KK; i3++) {
  240. for (i4=0; i4<KK; i4++) {
  241.   switch (l) {
  242.     case 0: m=i0; break;
  243.     case 1: m=i1; break;
  244.     case 2: m=i2; break;
  245.     case 3: m=i3; break;
  246.     case 4: m=i4; break;
  247.     default: break;};
  248.   arry[i0][i1][i2][i3][i4]=binrule[i0][i1][i2][i3][i4]==m?'Y':'N';
  249.   };};};};};
  250. apass2i(arry);
  251. apass2o(arry);
  252. apass4(arry);
  253. }
  254.  
  255. /* Pass 1x analyzes all the configurations mapping into a constant */
  256. xpass1(c) int c; {
  257. char arry[KK][KK][KK][KK][KK];
  258. int  i0, i1, i2, i3, i4;
  259. mc=1;
  260. asctobin();
  261. printf(" Pass1a\015");
  262. for (i0=0; i0<KK; i0++) {
  263. for (i1=0; i1<KK; i1++) {
  264. for (i2=0; i2<KK; i2++) {
  265. for (i3=0; i3<KK; i3++) {
  266. for (i4=0; i4<KK; i4++) {
  267.   arry[i0][i1][i2][i3][i4]=binrule[i0][i1][i2][i3][i4]==c?'Y':'N';
  268.   };};};};};
  269. apass2i(arry);
  270. apass2o(arry);
  271. apass4(arry);
  272. }
  273.  
  274. /* Pass 2i flags all links with an incoming arrow */
  275. /* Pass 2o flags all links with an outgoing arrow */
  276. /* Then pass 3 discards all unflagged links */
  277. /* Passes 2 and 3 alternate until no change is observed */
  278.  
  279. apass2i(arry) char arry[KK][KK][KK][KK][KK]; {
  280. int i0, i1, i2, i3, i4, m;
  281. do {
  282. printf(" Pass2i\015");
  283. for (i0=0; i0<KK; i0++) {
  284. for (i1=0; i1<KK; i1++) {
  285. for (i2=0; i2<KK; i2++) {
  286. for (i3=0; i3<KK; i3++) {
  287. for (i4=0; i4<KK; i4++) {
  288. if ((arry[i0][i1][i2][i3][i4]&0x5F)=='Y')
  289.   {for (m=0; m<KK; m++) arry[i1][i2][i3][i4][m]|=0x20;};
  290. };};};};}; } while (apass3(arry)!=0); }
  291.  
  292. apass2o(arry) char arry[KK][KK][KK][KK][KK]; {
  293. int i0, i1, i2, i3, i4, m;
  294. do {
  295. printf(" Pass2o\015");
  296. for (i0=0; i0<KK; i0++) {
  297. for (i1=0; i1<KK; i1++) {
  298. for (i2=0; i2<KK; i2++) {
  299. for (i3=0; i3<KK; i3++) {
  300. for (i4=0; i4<KK; i4++) {
  301. if ((arry[i0][i1][i2][i3][i4]&0x5F)=='Y')
  302.   {for (m=0; m<KK; m++) arry[m][i0][i1][i2][i3]|=0x20;};
  303. };};};};}; } while (apass3(arry)!=0); }
  304.  
  305. /* Pass 3 - erase flags, mark survivors, detect changes */
  306.  
  307. int apass3(arry) char arry[KK][KK][KK][KK][KK]; {
  308. int i0, i1, i2, i3, i4, l;
  309. l=0;
  310. printf(" Pass3 \015");
  311. for (i0=0; i0<KK; i0++) {
  312. for (i1=0; i1<KK; i1++) {
  313. for (i2=0; i2<KK; i2++) {
  314. for (i3=0; i3<KK; i3++) {
  315. for (i4=0; i4<KK; i4++) {
  316.   switch (arry[i0][i1][i2][i3][i4]) {
  317.     case 'y': arry[i0][i1][i2][i3][i4]='Y'; break;
  318.     case 'Y': arry[i0][i1][i2][i3][i4]='N'; l=1; break;
  319.     case 'n': case 'N': arry[i0][i1][i2][i3][i4]='N'; break;
  320.     default: break; };
  321. };};};};};
  322. return l;
  323. }
  324.  
  325. /* Pass 4 - print loops which remain */
  326. apass4(arry) char arry[KK][KK][KK][KK][KK]; {
  327. int i0, i1, i2, i3, i4;
  328. int j0, j1, j2, j3, j4;
  329. int k, l, m;
  330. printf(" pass4 \015");
  331. for (i0=0; i0<KK; i0++) {
  332. for (i1=0; i1<KK; i1++) {
  333. for (i2=0; i2<KK; i2++) {
  334. for (i3=0; i3<KK; i3++) {
  335. for (i4=0; i4<KK; i4++) {
  336. j0=i0; j1=i1; j2=i2; j3=i3; j4=i4;
  337. l=0; m=0;
  338. do {
  339.         if (arry[0][j1][j2][j3][j4]=='Y')
  340.     {arry[0][j1][j2][j3][j4]='y';
  341.     k=j4; j4=j3; j3=j2; j2=j1; j1=0; m=1;}
  342.   else {if (arry[1][j1][j2][j3][j4]=='Y')
  343.     {arry[1][j1][j2][j3][j4]='y';
  344.     k=j4; j4=j3; j3=j2; j2=j1; j1=1; m=1;}
  345.   else {l=1; if (m==1) {j0=j1; j1=j2; j2=j3; j3=j4; j4=k;}; };};
  346.   } while (l==0);
  347. l=0; m=0;
  348. do {
  349.         if (arry[j0][j1][j2][j3][0]=='y')
  350.    {aprf(j0,j1,j2,j3,0);
  351.    arry[j0][j1][j2][j3][0]='N';
  352.    j0=j1; j1=j2; j2=j3; j3=0; m=1;}
  353.   else {if (arry[j0][j1][j2][j3][1]=='y')
  354.    {aprf(j0,j1,j2,j3,1);
  355.    arry[j0][j1][j2][j3][1]='N';
  356.    j0=j1; j1=j2; j2=j3; j3=1; m=1;}
  357.   else {l=1;};};
  358.   } while (l==0);
  359. l=0;
  360. do {
  361.         if (arry[j0][j1][j2][j3][0]=='Y')
  362.    {aprf(j0,j1,j2,j3,0);
  363.    arry[j0][j1][j2][j3][0]='N';
  364.    j0=j1; j1=j2; j2=j3; j3=0; m=1;}
  365.   else {if (arry[j0][j1][j2][j3][1]=='Y')
  366.    {aprf(j0,j1,j2,j3,1);
  367.    arry[j0][j1][j2][j3][1]='N';
  368.    j0=j1; j1=j2; j2=j3; j3=1; m=1;}
  369.   else {l=1; if (m==1) kwait(0);};};
  370.   } while (l==0);
  371. };};};};};
  372. }
  373.  
  374. /* print one link of the de Bruijn diagram */
  375. aprf(i0,i1,i2,i3,i4) int i0, i1, i2, i3, i4; {
  376. kwait(1);
  377. printf("%1d",i0);
  378. printf("%1d",i1);
  379. printf("%1d",i2);
  380. printf("%1d",i3);
  381. printf("-");
  382. printf("%1d",i4);
  383. printf("  ");
  384. lijnk(dd,((i0*KK+i1)*KK+i2)*KK+i3,((i1*KK+i2)*KK+i3)*KK+i4,3);
  385. }
  386.  
  387. /* TWO21.C */
  388.  
  389. /* Pass 1 analyzes all sequences conforming to (2,-2+l)  */
  390. bpass1(l) int l; {
  391. char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK];
  392. int  i0, i1, i2, i3, i4, i5, i6, i7, i8;
  393. int  j0, j1, j2, j3, j4, m;
  394. mc=1;
  395. asctobin();
  396. printf(" Pass1a\015");
  397. for (i0=0; i0<KK; i0++) {
  398. for (i1=0; i1<KK; i1++) {
  399. for (i2=0; i2<KK; i2++) {
  400. for (i3=0; i3<KK; i3++) {
  401. for (i4=0; i4<KK; i4++) {
  402. for (i5=0; i5<KK; i5++) {
  403. for (i6=0; i6<KK; i6++) {
  404. for (i7=0; i7<KK; i7++) {
  405. for (i8=0; i8<KK; i8++) {
  406.   j0=binrule[i0][i1][i2][i3][i4];
  407.   j1=binrule[i1][i2][i3][i4][i5];
  408.   j2=binrule[i2][i3][i4][i5][i6];
  409.   j3=binrule[i3][i4][i5][i6][i7];
  410.   j4=binrule[i4][i5][i6][i7][i8];
  411.   switch (l) {
  412.     case 0: m=i0; break;
  413.     case 1: m=i1; break;
  414.     case 2: m=i2; break;
  415.     case 3: m=i3; break;
  416.     case 4: m=i4; break;
  417.     case 5: m=i5; break;
  418.     case 6: m=i6; break;
  419.     case 7: m=i7; break;
  420.     case 8: m=i8; break;
  421.     default: break;};
  422.   arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]=binrule[j0][j1][j2][j3][j4]==m?'Y':'N';
  423.   };};};};};};};};};
  424. bpass2i(arry);
  425. bpass2o(arry);
  426. bpass4(arry);
  427. }
  428.  
  429. /* Passs 2i flags links which have an incoming arrow */
  430. bpass2i(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  431. int i0, i1, i2, i3, i4, i5, i6, i7, i8,m;
  432. printf(" Pass2i\015");
  433. do {
  434. for (i0=0; i0<KK; i0++) {
  435. for (i1=0; i1<KK; i1++) {
  436. for (i2=0; i2<KK; i2++) {
  437. for (i3=0; i3<KK; i3++) {
  438. for (i4=0; i4<KK; i4++) {
  439. for (i5=0; i5<KK; i5++) {
  440. for (i6=0; i6<KK; i6++) {
  441. for (i7=0; i7<KK; i7++) {
  442. for (i8=0; i8<KK; i8++) {
  443. if ((arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]&0x5F)=='Y')
  444.  {for (m=0; m<KK; m++) arry[i1][i2][i3][i4][i5][i6][i7][i8][m]|=0x20;};
  445. };};};};};};};};};
  446. } while (bpass3(arry)!=0); }
  447.  
  448. /* Passs 2o flags links which have an outgoing arrow */
  449. bpass2o(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  450. int i0, i1, i2, i3, i4, i5, i6, i7, i8, m;
  451. do {
  452. printf(" Pass2o\015");
  453. for (i0=0; i0<KK; i0++) {
  454. for (i1=0; i1<KK; i1++) {
  455. for (i2=0; i2<KK; i2++) {
  456. for (i3=0; i3<KK; i3++) {
  457. for (i4=0; i4<KK; i4++) {
  458. for (i5=0; i5<KK; i5++) {
  459. for (i6=0; i6<KK; i6++) {
  460. for (i7=0; i7<KK; i7++) {
  461. for (i8=0; i8<KK; i8++) {
  462. if ((arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]&0x5F)=='Y')
  463.  {for (m=0; m<KK; m++) arry[m][i0][i1][i2][i3][i4][i5][i6][i7]|=0x20;};
  464. };};};};};};};};};
  465. } while (bpass3(arry)!=0); }
  466.  
  467. /*  Pass 3 erases flags, marks survivors, counts channges */
  468. int bpass3(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  469. int i0, i1, i2, i3, i4, i5, i6, i7, i8, l;
  470. printf(" Pass3 \015");
  471. l=0;
  472. for (i0=0; i0<KK; i0++) {
  473. for (i1=0; i1<KK; i1++) {
  474. for (i2=0; i2<KK; i2++) {
  475. for (i3=0; i3<KK; i3++) {
  476. for (i4=0; i4<KK; i4++) {
  477. for (i5=0; i5<KK; i5++) {
  478. for (i6=0; i6<KK; i6++) {
  479. for (i7=0; i7<KK; i7++) {
  480. for (i8=0; i8<KK; i8++) {
  481. switch (arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]) {
  482.     case 'y': arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]='Y'; break;
  483.     case 'Y': arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]='N'; l=1; break;
  484.     case 'n': case 'N': arry[i0][i1][i2][i3][i4][i5][i6][i7][i8]='N'; break;
  485.     default: break; };
  486. };};};};};};};};};
  487. return l;
  488. }
  489.  
  490. /* Pass 4 prints loops which remain */
  491. bpass4(arry) char arry[KK][KK][KK][KK][KK][KK][KK][KK][KK]; {
  492. int i0, i1, i2, i3, i4, i5, i6, i7, i8;
  493. int j0, j1, j2, j3, j4, j5, j6, j7, j8;
  494. int k, l, m;
  495. printf(" pass4 \015");
  496. for (i0=0; i0<KK; i0++) {
  497. for (i1=0; i1<KK; i1++) {
  498. for (i2=0; i2<KK; i2++) {
  499. for (i3=0; i3<KK; i3++) {
  500. for (i4=0; i4<KK; i4++) {
  501. for (i5=0; i5<KK; i5++) {
  502. for (i6=0; i6<KK; i6++) {
  503. for (i7=0; i7<KK; i7++) {
  504. for (i8=0; i8<KK; i8++) {
  505. j0=i0; j1=i1; j2=i2; j3=i3; j4=i4; j5=i5; j6=i6; j7=i7; j8=i8; l=0; m=0;
  506. do {
  507.         if (arry[0][j1][j2][j3][j4][j5][j6][j7][j8]=='Y')
  508.     {arry[0][j1][j2][j3][j4][j5][j6][j7][j8]='y';
  509.     k=j8; j8=j7; j7=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=0; m=1;}
  510.   else {if (arry[1][j1][j2][j3][j4][j5][j6][j7][j8]=='Y')
  511.     {arry[1][j1][j2][j3][j4][j5][j6][j7][j8]='y';
  512.     k=j8; j8=j7; j7=j6; j6=j5; j5=j4; j4=j3; j3=j2; j2=j1; j1=1; m=1;}
  513.   else {l=1; if (m==1) {j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=j8; j8=k;}; };};
  514.   } while (l==0);
  515. l=0; 
  516. m=0;
  517. do {
  518.         if (arry[j0][j1][j2][j3][j4][j5][j6][j7][0]=='y')
  519.    {bprf(j0,j1,j2,j3,j4,j5,j6,j7,0);
  520.    arry[j0][j1][j2][j3][j4][j5][j6][j7][0]='N';
  521.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=0; m=1;}
  522.   else {if (arry[j0][j1][j2][j3][j4][j5][j6][j7][1]=='y')
  523.    {bprf(j0,j1,j2,j3,j4,j5,j6,j7,1);
  524.    arry[j0][j1][j2][j3][j4][j5][j6][j7][1]='N';
  525.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=1; m=1;}
  526.   else {l=1;};};
  527.   } while (l==0);
  528. l=0;
  529. do {
  530.         if (arry[j0][j1][j2][j3][j4][j5][j6][j7][0]=='Y')
  531.    {bprf(j0,j1,j2,j3,j4,j5,j6,j7,0);
  532.    arry[j0][j1][j2][j3][j4][j5][j6][j7][0]='N';
  533.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=0; m=1;}
  534.   else {if (arry[j0][j1][j2][j3][j4][j5][j6][j7][1]=='Y')
  535.    {bprf(j0,j1,j2,j3,j4,j5,j6,j7,1);
  536.    arry[j0][j1][j2][j3][j4][j5][j6][j7][1]='N';
  537.    j0=j1; j1=j2; j2=j3; j3=j4; j4=j5; j5=j6; j6=j7; j7=1; m=1;}
  538.   else {l=1; if (m==1) {kwait(0);} ;};};
  539.   } while (l==0);
  540. };};};};};};};};};
  541. }
  542.  
  543. /* print one of the links in a chain */
  544. bprf(i0,i1,i2,i3,i4,i5,i6,i7,i8) int i0, i1, i2, i3, i4, i5, i6, i7, i8; {
  545. int i, j;
  546. kwait(1);
  547. printf("%1d",i0);
  548. printf("%1d",i1);
  549. printf("%1d",i2);
  550. printf("%1d",i3);
  551. printf("%1d",i4);
  552. printf("%1d",i5);
  553. printf("%1d",i6);
  554. printf("%1d",i7);
  555. printf("-");
  556. printf("%1d",i8);
  557. printf(" ");
  558. i=((((((i0*KK+i1)*KK+i2)*KK+i3)*KK+i4)*KK+i5)*KK+i6)*KK+i7;
  559. j=((((((i1*KK+i2)*KK+i3)*KK+i4)*KK+i5)*KK+i6)*KK+i7)*KK+i8;
  560. lijnk(dd,i,j,3);
  561. }
  562.  
  563. /* pause at the end of a full screen        */
  564. /* kwait(0) - short or null line        */
  565. /* kwait(1) - split long lines as necessary */
  566. /* kwait(2) - wait to continue            */
  567. /* kwait(3) - reset                 */
  568. kwait(i) int i; {
  569. switch (i) {
  570.   case 0: printf("\n"); nc=0; nl++; break;
  571.   case 1: if (nc==mc) {printf("&\n"); nc=1; nl++;} else nc++; break;
  572.   case 2: nl=NW; break;
  573.   case 3: nc=0; nl=0; break;
  574.   default: break;};
  575. if (nl==NW) {
  576.   nl=1;
  577.   printf(" press any key to continue\015");
  578.   while (kbdst()) {};
  579.   kbdin();
  580.   printf("                          \015");
  581.   videoscroll(1,0,24,14,0,0);
  582.   videocursor(0,0,0);
  583.   printf("\n");
  584.   };
  585. }
  586.  
  587. /* end */
  588.